package com.equipment;

import java.util.NoSuchElementException;

import android.util.Log;

import com.util.EncodingUtil;

/**
 * 国标脱机检测D5
 * @author Administrator
 *
 */
public class ChineseDetectionOBUResponse {
	// 帧开始标记
	private String stx = "55AA";
	// 串口帧序列号
	private String rsctl = "00";
	// 长度
	private String Length = "";
	// 代码类型
	private String code = "DF";
	// 拓展子码
	private String subCode = "BA";
	// 异或校验值
	private String bcc = "";

	// 状态 0表示找到OBU，非0表示未找到OBU
	private String status = "";
	// OBU MAC地址
	private String obuMac = "";
	// OBU状态 OBUStatus的定义如表1-1
	private String OBUStatus = "";
	// 信息位标志，Bit0：系统信息（0：无，1：有）；Bit1：车辆信息（0：无，1：有）；Bit2：CPU卡15文件信息（0：无，1：有）；Bit3：卡余额（0：无，1：有）；
	private String InfoFlag = "";
	// 系统信息长度，由InfoFlag决定是否有该位
	private String systemInfoLen = "";
	// 系统信息
	private String sysInfo = "";
	// 车辆信息长度
	private String vehicleInfoLen = "";
	// 车辆信息
	private String vehicleInfo = "";
	// CPU卡15文件信息长度，由InfoFlag决定是否有该位
	private String cardInfoLen = "";
	// CPU卡15文件信息
	private String cardInfo = "";
	// CPU卡钱包余额长度
	private String cardRestMoneyLen = "";
	// CPU卡钱包余额
	private String cardRestMoney = "";


	/**
	 * 解析BA指令
	 *
	 * @param context
	 * @return
	 */
	public DetectionOBUResponse analysis(String context)
			throws NoSuchElementException {
		DetectionOBUResponse dr = null;
		// 判断是否是BA指令
		if (!context.substring(12, 14).toUpperCase().equals("D5")) {
			throw new NoSuchElementException("检测数据帧命令字错误！");
		}
		// 是否找到OBU
		if (!context.substring(14, 16).equals("00")) {
			throw new NoSuchElementException("检测失败："+EncodingUtil.getErrorResult(EncodingUtil.hexToDec(context.substring(14, 16))));
		}
		// InfoFlag 8bit判断信息位标志，
		InfoFlag = context.substring(28, 30);
		// Bit0：系统信息（0：无，1：有）；Bit1：车辆信息（0：无，1：有）；Bit2：CPU卡15文件信息（0：无，1：有）；Bit3：卡余额（0：无，1：有）；
		int i = Integer.parseInt(InfoFlag, 16);
		String flag = EncodingUtil.jointZero(Integer.toBinaryString(i), 8);
		// 如果没问题就new 对象 把解析的值放入对象
		dr = new DetectionOBUResponse();
		// 解析串口帧序列号
		rsctl = context.substring(4, 6);
		dr.setRsctl(rsctl);
		// 解析长度
		Length = context.substring(6, 10);
		dr.setLength(Length);
		// 解析代码类型
		code = context.substring(10, 12);
		dr.setCode(code);
		// 解析拓展子代码
		subCode = context.substring(12, 14);
		dr.setSubCode(subCode);
		// 解析状态码
		status = context.substring(14, 16);
		dr.setStatus(status);
		// 解析OBUMAC
		obuMac = context.substring(16, 24);
		dr.setObuMac(obuMac);
		// 解析OBUStatus
		OBUStatus = context.substring(24, 28);
		dr.setOBUStatus(OBUStatus);
		// 解析InfoFlag
		InfoFlag = context.substring(28, 30);
		dr.setInfoFlag(InfoFlag);
		// 判断是否有系统信息
		if (flag.substring(7).equals("0")) {
			systemInfoLen = "0";
			dr.setSystemInfoLen(systemInfoLen);
		} else {
			// 解析系统信息长度
			systemInfoLen = context.substring(30, 32);
			dr.setSystemInfoLen(systemInfoLen);
			// 解析系统信息
			sysInfo = context.substring(32, 84);
			dr.setSysInfo(sysInfo);
		}
		// 判断是否有车辆信息
		if (flag.substring(6, 7).equals("0")) {
			vehicleInfoLen = "0";
			dr.setVehicleInfoLen(vehicleInfoLen);
		} else {
			if (systemInfoLen.equals("0")) {
				// 解析车辆信息长度
				vehicleInfoLen = context.substring(30, 32);
				dr.setVehicleInfoLen(vehicleInfoLen);
				// 解析车辆信息
				vehicleInfo = context.substring(32, 64);
				dr.setVehicleInfo(vehicleInfo);
			} else {
				// 解析车辆信息长度
				vehicleInfoLen = context.substring(84, 86);
				dr.setVehicleInfoLen(vehicleInfoLen);
				// 解析车辆信息
				vehicleInfo = context.substring(86, 118);
				dr.setVehicleInfo(vehicleInfo);
			}

		}
		// 判断是否有CPU15文件信息
		if (flag.substring(5, 6).equals("0")) {
			Log.e("没有CPU卡信息", "确认");
			cardInfoLen = "0";
			dr.setCardInfoLen(cardInfoLen);
		} else {
			if (!systemInfoLen.equals("0") && !vehicleInfoLen.equals("0")) {
				// 解析CPU卡15文件信息长度
				cardInfoLen = context.substring(118, 120);
				dr.setCardInfoLen(cardInfoLen);
				// CPU卡15文件信息
				cardInfo = context.substring(120, 206);
				dr.setCardInfo(cardInfo);
			} else if (systemInfoLen.equals("0") && !vehicleInfoLen.equals("0")) {
				// 解析CPU卡15文件信息长度
				cardInfoLen = context.substring(64, 66);
				dr.setCardInfoLen(cardInfoLen);
				// CPU卡15文件信息
				cardInfo = context.substring(66, 152);
				dr.setCardInfo(cardInfo);
			} else if (!systemInfoLen.equals("0") && vehicleInfoLen.equals("0")) {
				// 解析CPU卡15文件信息长度
				cardInfoLen = context.substring(84, 86);
				dr.setCardInfoLen(cardInfoLen);
				// CPU卡15文件信息
				cardInfo = context.substring(86, 172);
				dr.setCardInfo(cardInfo);
			} else if (systemInfoLen.equals("0") && vehicleInfoLen.equals("0")) {
				// 解析CPU卡15文件信息长度
				cardInfoLen = context.substring(30, 32);
				dr.setCardInfoLen(cardInfoLen);
				// CPU卡15文件信息
				cardInfo = context.substring(32, 118);
				dr.setCardInfo(cardInfo);
			}

		}
		// 判断是否有CUP卡钱包信息
		if (flag.substring(4, 5).equals("0")) {
			cardRestMoneyLen = "0";
			dr.setCardRestMoneyLen(cardRestMoneyLen);
		} else {
			// 111 系统信息有 车辆信息有 卡15文件信息有
			if (!systemInfoLen.equals("0") && !vehicleInfoLen.equals("0")
					&& !cardInfoLen.equals("0")) {
				// 解析CPU卡钱包余额长度
				cardRestMoneyLen = context.substring(206, 208);
				dr.setCardRestMoneyLen(cardRestMoneyLen);
				// 解析CPU卡钱包余额
				cardRestMoney = context.substring(208, 216);
				dr.setCardRestMoney(cardRestMoney);
				// 011 系统信息没有 车辆信息有 卡15文件信息有
			} else if (systemInfoLen.equals("0") && !vehicleInfoLen.equals("0")
					&& !cardInfoLen.equals("0")) {
				// 解析CPU卡钱包余额长度
				cardRestMoneyLen = context.substring(152, 154);
				dr.setCardRestMoneyLen(cardRestMoneyLen);
				// 解析CPU卡钱包余额
				cardRestMoney = context.substring(154, 162);
				dr.setCardRestMoney(cardRestMoney);
				// 001 系统信息没有 车辆信息没有 卡15文件信息有
			} else if (systemInfoLen.equals("0") && vehicleInfoLen.equals("0")
					&& !cardInfoLen.equals("0")) {
				// 解析CPU卡钱包余额长度
				cardRestMoneyLen = context.substring(118, 120);
				dr.setCardRestMoneyLen(cardRestMoneyLen);
				// 解析CPU卡钱包余额
				cardRestMoney = context.substring(120, 128);
				dr.setCardRestMoney(cardRestMoney);
				// 100 系统信息有 车辆信息没有 卡15文件信息没有
			} else if (!systemInfoLen.equals("0") && vehicleInfoLen.equals("0")
					&& cardInfoLen.equals("0")) {
				// 解析CPU卡钱包余额长度
				cardRestMoneyLen = context.substring(84, 86);
				dr.setCardRestMoneyLen(cardRestMoneyLen);
				// 解析CPU卡钱包余额
				cardRestMoney = context.substring(86, 94);
				dr.setCardRestMoney(cardRestMoney);
				// 110 系统信息有 车辆信息有 卡15文件信息没有
			} else if (!systemInfoLen.equals("0")
					&& !vehicleInfoLen.equals("0") && cardInfoLen.equals("0")) {
				// 解析CPU卡钱包余额长度
				cardRestMoneyLen = context.substring(118, 120);
				dr.setCardRestMoneyLen(cardRestMoneyLen);
				// 解析CPU卡钱包余额
				cardRestMoney = context.substring(120, 128);
				dr.setCardRestMoney(cardRestMoney);
				// 000 系统信息没有 车辆信息没有 卡15文件信息没有
			} else if (systemInfoLen.equals("0") && vehicleInfoLen.equals("0")
					&& cardInfoLen.equals("0")) {
				// 解析CPU卡钱包余额长度
				cardRestMoneyLen = context.substring(30, 32);
				dr.setCardRestMoneyLen(cardRestMoneyLen);
				// 解析CPU卡钱包余额
				cardRestMoney = context.substring(32, 40);
				dr.setCardRestMoney(cardRestMoney);
				// 101 系统信息有 车辆信息没有 卡15文件信息有
			} else if (!systemInfoLen.equals("0") && vehicleInfoLen.equals("0")
					&& !cardInfoLen.equals("0")) {
				// 解析CPU卡钱包余额长度
				cardRestMoneyLen = context.substring(172, 174);
				dr.setCardRestMoneyLen(cardRestMoneyLen);
				// 解析CPU卡钱包余额
				cardRestMoney = context.substring(174, 182);
				dr.setCardRestMoney(cardRestMoney);
				// 010 系统信息没有 车辆信息有 卡15文件信息没有
			} else if (systemInfoLen.equals("0") && !vehicleInfoLen.equals("0")
					&& cardInfoLen.equals("0")) {
				// 解析CPU卡钱包余额长度
				cardRestMoneyLen = context.substring(64, 68);
				dr.setCardRestMoneyLen(cardRestMoneyLen);
				// 解析CPU卡钱包余额
				cardRestMoney = context.substring(68, 76);
				dr.setCardRestMoney(cardRestMoney);
			}

		}
		return dr;
	}

	public String getStx() {
		return stx;
	}

	public void setStx(String stx) {
		this.stx = stx;
	}

	public String getRsctl() {
		return rsctl;
	}

	public void setRsctl(String rsctl) {
		this.rsctl = rsctl;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public String getSubCode() {
		return subCode;
	}

	public void setSubCode(String subCode) {
		this.subCode = subCode;
	}

	public String getBcc() {
		return bcc;
	}

	public void setBcc(String bcc) {
		this.bcc = bcc;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public String getObuMac() {
		return obuMac;
	}

	public void setObuMac(String obuMac) {
		this.obuMac = obuMac;
	}

	public String getOBUStatus() {
		return OBUStatus;
	}

	public void setOBUStatus(String oBUStatus) {
		OBUStatus = oBUStatus;
	}

	public String getInfoFlag() {
		return InfoFlag;
	}

	public void setInfoFlag(String infoFlag) {
		InfoFlag = infoFlag;
	}

	public String getSystemInfoLen() {
		return systemInfoLen;
	}

	public void setSystemInfoLen(String systemInfoLen) {
		this.systemInfoLen = systemInfoLen;
	}

	public String getSysInfo() {
		return sysInfo;
	}

	public void setSysInfo(String sysInfo) {
		this.sysInfo = sysInfo;
	}

	public String getVehicleInfoLen() {
		return vehicleInfoLen;
	}

	public void setVehicleInfoLen(String vehicleInfoLen) {
		this.vehicleInfoLen = vehicleInfoLen;
	}

	public String getVehicleInfo() {
		return vehicleInfo;
	}

	public void setVehicleInfo(String vehicleInfo) {
		this.vehicleInfo = vehicleInfo;
	}

	public String getCardInfoLen() {
		return cardInfoLen;
	}

	public void setCardInfoLen(String cardInfoLen) {
		this.cardInfoLen = cardInfoLen;
	}

	public String getCardInfo() {
		return cardInfo;
	}

	public void setCardInfo(String cardInfo) {
		this.cardInfo = cardInfo;
	}

	public String getCardRestMoneyLen() {
		return cardRestMoneyLen;
	}

	public void setCardRestMoneyLen(String cardRestMoneyLen) {
		this.cardRestMoneyLen = cardRestMoneyLen;
	}

	public String getCardRestMoney() {
		return cardRestMoney;
	}

	public void setCardRestMoney(String cardRestMoney) {
		this.cardRestMoney = cardRestMoney;
	}

	public String getLength() {
		return Length;
	}

	public void setLength(String length) {
		Length = length;
	}
}
